﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using Business_Layer;
using DevComponents.DotNetBar.Controls;
using Data_Access_Layer;
using log4net.Config;
using log4net;

namespace CaffeBillard
{
	public partial class FormOrder : DevComponents.DotNetBar.Office2007Form
	{
		protected static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
		public FormOrder()
		{
			InitializeComponent();
			dgvOrder.AutoGenerateColumns = false;
			dgvOrderDetail.AutoGenerateColumns = false;
            dgvOrder2.AutoGenerateColumns = false;
            dgvOrderDetail2.AutoGenerateColumns = false;
		}
		/// <summary>
		/// Khai báo các thuộc tính cần dùng
		/// </summary>
		//tạo đối tượng điều khiển hóa đơn
		private OrderController _manager;

	    private ArticleController articleController;
	    private SuppilerController suppilerController;
	    private DeskController deskController;
	    private EmployeeController employeeController;
		//Tạo đối tượng điều khiển lớp chi tiết hóa đơn
		private OrderDetailController _detail;
		/// <summary>
		/// Tạo biến lưu trạng thái chọn tất cả của datagridview show của hóa đơn mua
		/// </summary>
	    private bool _selectall;
		private bool _curr;
		//Tạo biến lưu mã hóa đơn 
		private int id;
        //Tạo biến lưu mã nhà cung cấp
	    private int supid;
        /// <summary>
        /// Lấy tên nhân viên
        /// </summary>
	    private string name = "";
        


		//Load form
		private void FormOrder_Load(object sender, EventArgs e)
		{
            name = Employee.Objects.FirstOrDefault(x => x.Id == WorkSession.Current.CurrentAccount.EmpId).Name.ToString();
			_manager= new OrderController();
			_detail= new OrderDetailController();
            deskController= new DeskController();
            suppilerController= new SuppilerController();
            articleController= new ArticleController();
            employeeController= new EmployeeController();
			Load_Order();
			this.CreateColumn();
          
		}
		//Load dữ liệu lên các datagridview
		private void Load_Order()
		{
			dgvOrder.DataSource = new BindingSource {DataSource = _manager.GetAll(true)};
            dgvOrder2.DataSource = new BindingSource { DataSource = _manager.GetAll(false) };
		}

        #region Hóa đơn bán

        //Tìm kiếm
        private void txtKeys_TextChanged(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + " Tim kiem hoa don theo ma");


            if (txtKeys.Text != "")
            {
                int n = 0;
                switch (cbbFindType.Text)
                {

                    case "Mã":

                        if (int.TryParse(txtKeys.Text, out n))
                            dgvOrder.DataSource = new BindingSource
                                                          {
                                                              DataSource =
                                                                  _manager.FindById(int.Parse(txtKeys.Text), true)
                                                          };
                        else
                        {
                            txtKeys.Text = "";
                        }
                        break;



                }


            }
            else
            {
                dgvOrder.DataSource = new BindingSource
                                              {
                                                  DataSource =
                                                      _manager.GetAll( true)
                                              };
            }
        }
        //Tìm theo nhân viên hoặc bàn
        private void cbbES_SelectedIndexChanged(object sender, EventArgs e)
        {
            int n = 0;
            XmlConfigurator.Configure();
            log.Info(name + " Tim kiem hoa don ban theo nguoi lap, ban");

            switch (cbbFindType.Text)
            {
                
                case "Người lập":
                    if (int.TryParse(cbbED.SelectedValue.ToString(), out n))
                        dgvOrder.DataSource = new BindingSource
                        {
                            DataSource =
                                _manager.FindbyEmployee(int.Parse(cbbED.SelectedValue.ToString()), true)
                        };
                   
                    break;
                case "Bàn":
                    if (int.TryParse(cbbED.SelectedValue.ToString(), out n))
                        dgvOrder.DataSource = new BindingSource { DataSource = _manager.FindByDesk(int.Parse(cbbED.SelectedValue.ToString())) };
                   
                    break;

            }
        }

        private void cbbFindType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbbFindType.Text == "Ngày lập")
            {
                txtKeys.Enabled = false;
                dtpDate.Enabled = true;
                cbbED.Enabled = false;
            }
            else if (cbbFindType.Text == "Mã")
            {
                txtKeys.Enabled = true;
                dtpDate.Enabled = false;
                cbbED.Enabled = false;
            }
            else if (cbbFindType.Text == "Người lập")
            {
                cbbED.Enabled = true;
                txtKeys.Enabled = false;
                dtpDate.Enabled = false;
                cbbED.DataSource = employeeController.GetAll();
                cbbED.DisplayMember = "Name";
                cbbED.ValueMember = "Id";
            }
            else if (cbbFindType.Text == "Bàn")
            {
                 cbbED.Enabled = true;
                txtKeys.Enabled = false;
                dtpDate.Enabled = false;
                cbbED.DataSource = deskController.GetAll();
                cbbED.DisplayMember = "DeskName";
                cbbED.ValueMember = "Id";
            }
            else
            {
                if (cbbFindType.Text == "Tất cả")
                {
                    dgvOrder.DataSource = new BindingSource {DataSource = _manager.GetAll(true)};
                    cbbED.Enabled = false;
                    txtKeys.Enabled = false;
                    dtpDate.Enabled = false;
                }
            }
        }

        //Tìm hóa đơn theo ngày
        private void dtpDate_ValueChanged(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + " Tim kiem hoa don ban theo ngay");

            try
            {
                dgvOrder.DataSource = new BindingSource { DataSource = _manager.FindByOrderDate(dtpDate.Value, true) };
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n" + ex.Message);
            }
        }

        private void dgvSellOrder_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (dgvOrder.CurrentRow.Cells[0].Value != null)
                {
                    id = int.Parse(dgvOrder.CurrentRow.Cells[0].Value.ToString());

                    dgvOrderDetail.DataSource = new BindingSource
                                                        {
                                                            DataSource =
                                                                _detail.GetAll(
                                                                    int.Parse(
                                                                        dgvOrder.CurrentRow.Cells[0].Value.ToString()))
                                                        };
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n" + ex.Message);
            }
        }

        //Tạo thêm cột để hiển thị tên thay vì mã
        private void CreateColumn()
        {
            try
            {
                art.DataSource = articleController.GetAll();
                art.DisplayMember = "ArtName";
                art.ValueMember = "Id";

                art2.DataSource = articleController.GetAll();
                art2.DisplayMember = "ArtName";
                art2.ValueMember = "Id";

                desk.DataSource = deskController.GetAll();
                desk.DisplayMember = "DeskName";
                desk.ValueMember = "Id";

                emp.DataSource = employeeController.GetAll();
                emp.DisplayMember = "Name";
                emp.ValueMember = "Id";

                sup.DataSource = suppilerController.GetAll();
                sup.DisplayMember = "SupName";
                sup.ValueMember = "Id";

                clemp.DataSource = employeeController.GetAll();
                clemp.DisplayMember = "Name";
                clemp.ValueMember = "Id";
            }
            catch(Exception ex)
            {
                MessageBox.Show("Lỗi \n" + ex.Message);
            }

        }

        private void cậpNhậtChiTiếtHóaĐơnChoHóaĐơnNàyToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (id != 0)
            {
                FormOrderDetail frm = new FormOrderDetail(id, supid);
                frm.Show();
                frm.Closed += frm_Closed;
            }
            else
            {
                MessageBox.Show("Không có hóa đơn nào được chọn");
            }
        }

        void frm_Closed(object sender, EventArgs e)
        {
            try
            {
                Load_Order();
                dgvOrderDetail2.DataSource = _detail.GetAll(id);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n" + ex.Message);
            }
           
        }


		
        #endregion

        #region Hóa đơn mua

        //Tìm kiếm
        private void txtKeys2_TextChanged(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + " Tim kiem hoa don mua theo ma");

            int n = 0;
                if (txtKeys2.Text != "")
                {
                    switch (cbbFindType2.Text)
                    {

                        case "Mã":
                            if (int.TryParse(txtKeys2.Text, out n))
                                dgvOrder2.DataSource = new BindingSource
                                                           {
                                                               DataSource =
                                                                   _manager.FindById(int.Parse(txtKeys2.Text), false)
                                                           };
                            else
                            {
                                txtKeys2.Text = "";
                            }
                            break;
                     

                    }
                }
                else
                    dgvOrder2.DataSource = new BindingSource
                    {
                        DataSource =
                            _manager.GetAll(false)
                    };

            
        }


        private void cbbFindType2_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbbFindType2.Text == "Ngày lập")
            {
                txtKeys2.Enabled = false;
                dtpDate2.Enabled = true;
                cbbES.Enabled = false;
            }
            else if (cbbFindType2.Text == "Mã")
            {
                txtKeys2.Enabled = true;
                dtpDate2.Enabled = false;
                cbbES.Enabled = false;
            }
            else if (cbbFindType2.Text == "Người lập")
            {
                cbbES.Enabled = true;
                txtKeys2.Enabled = false;
                dtpDate2.Enabled = false;
                cbbES.DataSource = employeeController.GetAll();
                cbbES.DisplayMember = "Name";
                cbbES.ValueMember = "Id";
            }
            else if (cbbFindType2.Text == "Nhà cung ứng")
            {
                cbbES.Enabled = true;
                txtKeys2.Enabled = false;
                dtpDate2.Enabled = false;
                cbbES.DataSource = suppilerController.GetAll();
                cbbES.DisplayMember = "SupName";
                cbbES.ValueMember = "Id";
            }
            else
            {
                if (cbbFindType2.Text == "Tất cả")
                {
                    dgvOrder2.DataSource = new BindingSource {DataSource = _manager.GetAll(false)};
                    cbbES.Enabled = false;
                    txtKeys2.Enabled = false;
                    dtpDate2.Enabled = false;
                }
            }
        }


        private void cbbES_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + " Tim kiem hoa don mua theo nguoi lap , nha cung ung");

            int n = 0;
            switch (cbbFindType2.Text)
                {
                    case "Người lập":
                        if (int.TryParse(cbbES.SelectedValue.ToString(), out n))
                            dgvOrder2.DataSource = new BindingSource
                                                       {
                                                           DataSource =
                                                               _manager.FindbyEmployee(
                                                                   int.Parse(cbbES.SelectedValue.ToString()), false)
                                                       };
                        else
                        {
                            txtKeys2.Text = "";
                        }
                        break;
                    case "Nhà cung ứng":
                        if (int.TryParse(cbbES.SelectedValue.ToString(), out n))
                            dgvOrder2.DataSource = new BindingSource
                                                       {
                                                           DataSource =
                                                               _manager.FindbySupplier(
                                                                   int.Parse(cbbES.SelectedValue.ToString()))
                                                       };
                        else
                        {
                            txtKeys2.Text = "";
                        }
                        break;

               
            }
        }




	    //Tìm hóa đơn theo ngày
        private void dtpDate2_ValueChanged(object sender, EventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + " Tim kiem hoa don mua theo ngay");
            try
            {
                dgvOrder2.DataSource = new BindingSource { DataSource = _manager.FindByOrderDate(dtpDate2.Value, false) };
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n" + ex.Message);
            }
        }

        private void dgvOrder2_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {

              //Nếu cột mã khác null 
                if (dgvOrder2.CurrentRow.Cells[1].Value != null)
                {
                    id = int.Parse(dgvOrder2.CurrentRow.Cells[1].Value.ToString());//Gán mã hóa đơn cho id
                    if (dgvOrder2.CurrentRow.Cells[4].Value !=null)
                         supid = int.Parse(dgvOrder2.CurrentRow.Cells[4].Value.ToString());
                    dgvOrderDetail2.DataSource = new BindingSource
                                                     {
                                                         DataSource =
                                                             _detail.GetAll(
                                                                 int.Parse(
                                                                     dgvOrder2.CurrentRow.Cells[1].Value.ToString()))
                                                     };//Show tất cả chi tiết hóa đơn có mã hóa đơn là id
                }
                //
                if(e.RowIndex==-1)
                {
                    if(e.ColumnIndex ==0)
                    {
                        if(_selectall)
                        {
                            for (int i = 0; i < dgvOrder2.Rows.Count-1; i++)
                            {
                                dgvOrder2.Rows[i].Cells[0].Value = false;
                            }
                            _selectall = false;
                        }
                        else
                        {
                            for (int i = 0; i < dgvOrder2.Rows.Count - 1; i++)
                            {
                                dgvOrder2.Rows[i].Cells[0].Value = true;
                            }
                            _selectall = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi :\n" + ex.Message);
            }
        }


        //Thêm hoặc cập nhật hóa đơn bán
        private void dgvOrder2_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            XmlConfigurator.Configure();
            log.Info(name + "Them moi hoa don mua");
            if (_curr)
            {
                try
                {
                    XmlConfigurator.Configure();
                    log.Info("Nhan vien: Them moi hoa don mua");
                    var d = dgvOrder2.Rows[e.RowIndex];
                    Order _order = new Order();
                    _order.Id = int.Parse(d.Cells[1].Value.ToString());
                    _order.OrderDate = DateTime.Now;
                    _order.SupId = int.Parse(d.Cells[4].Value.ToString());
                    _order.EmpId = WorkSession.Current.CurrentAccount.EmpId;
                    if (d.Cells[6].Value!=null)
                        _order.Notes = d.Cells[5].Value.ToString();
                    else
                    {
                        _order.Notes = "";
                    }
                     if (d.Cells[5].Value == null)
                        _order.Total = 0;
                    else
                    {
                        _order.Total = float.Parse(d.Cells[5].Value.ToString());
                    }
                    _order.Type = false;
                    if (_manager.InsertOrUpdate(_order))
                    {
                        MessageBox.Show("Cập nhật  thành công!!!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Information);
                        Load_Order();
                    }
                    else
                    {
                        MessageBox.Show("Không cập nhật được!!!" + _manager._err, "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Information);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Lỗi : \n" + ex.Message);
                }
            }
            _curr = false;
        }

        //Kiểm tra dữ liệu trước khi thêm
        private void dgvOrder2_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {
                if (dgvOrder2.IsCurrentRowDirty && e.ColumnIndex > 0)
                {
                    var _d = dgvOrder2.Rows[e.RowIndex];
                    if (_d.Cells[3].Value == null || _d.Cells[4].Value == null)
                    {
                        MessageBox.Show("Không được để trống dữ liệu!", "Thông báo", MessageBoxButtons.OK,
                                        MessageBoxIcon.Warning);
                        e.Cancel = true;
                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Lỗi hệ thống: \n" + ex.Message);
            }
            _curr = dgvOrder2.IsCurrentRowDirty;
        }

       


        #endregion

        //Xóa những hóa đơn mua đã chọn
        private void xóaHóaĐơnĐãChọnToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Lấy những dòng được chọn
            var selectedRows = dgvOrder2.Rows.Cast<DataGridViewRow>()
                    .Where(x => x.Cells[0].Value != null && x.Cells[1].Value != null && x.Cells[1].Value.ToString() !="0" && (bool)x.Cells[0].Value)
                    .ToList();
            //Nếu không có dòng nào được chọn thì thông báo cho người dùng chọn lại
            if (selectedRows.Count == 0)
            {
                MessageBox.Show("Bạn chưa chọn hóa đơn nào để xóa", "Thông báo",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            //Yêu cầu người dùng xác nhận việc xóa
            if (MessageBox.Show("Tất cả các hóa đơn đã chọn sẽ bị xóa, bạn có chắc muốn xóa không?", "Cảnh báo !!!", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                XmlConfigurator.Configure();
                log.Info(name + ": Xoa nha cung cap: ");
                //Duyệt qua từng dòng được chọn
                for (int i = selectedRows.Count - 1; i >= 0; i--)
                {
                    // Lấy ra nhà cung cấp được chọn
                    var order = selectedRows[i].DataBoundItem as Order;
                    order.Id = int.Parse(selectedRows[i].Cells[1].Value.ToString());
                    order.Deleted = true;
                    _manager.Delete(order);
                }
                //Load lại danh sách nhà cung cấp
                Load_Order();
            }
        }

       
      
        
       

       







    }
}